using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._3DAnalystTools._Statistics
{
    /// <summary>
    /// <para>Point File Information</para>
    /// <para>Generates statistical information about one or more point files in a polygon or multipatch output.</para>
    /// <para>生成有关面或多面体输出中一个或多个点文件的统计信息。</para>
    /// </summary>    
    [DisplayName("Point File Information")]
    public class PointFileInformation : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public PointFileInformation()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_input">
        /// <para>Point Data</para>
        /// <para><xdoc>
        ///   <para>Any combination of folders and files storing point records that will be analyzed.</para>
        ///   <para>In the tool dialog box, a folder can also be specified as an input by selecting the folder in Windows Explorer and dragging it onto the parameter's input box.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>存储将要分析的点记录的文件夹和文件的任意组合。</para>
        ///   <para>在工具对话框中，还可以通过在 Windows 资源管理器中选择文件夹并将其拖动到参数的输入框中，将文件夹指定为输入。</para>
        /// </xdoc></para>
        /// </param>
        /// <param name="_out_feature_class">
        /// <para>Output Feature Class</para>
        /// <para>The feature class that will be produced.</para>
        /// <para>将生成的要素类。</para>
        /// </param>
        /// <param name="_in_file_type">
        /// <para>File Format</para>
        /// <para><xdoc>
        ///   <para>Specifies the format of the input files.</para>
        ///   <bulletList>
        ///     <bullet_item>LAS format lidar—Lidar data storage format defined by the American Society of Photogrammetry and Remote Sensing (ASPRS).</bullet_item><para/>
        ///     <bullet_item>ASCII file with XYZ—XYZ file.</bullet_item><para/>
        ///     <bullet_item>ASCII file with XYZI—XYZI file.</bullet_item><para/>
        ///     <bullet_item>ASCII file in Generate format—GENERATE file.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定输入文件的格式。</para>
        ///   <bulletList>
        ///     <bullet_item>LAS 格式激光雷达 - 美国摄影测量与遥感学会 （ASPRS） 定义的激光雷达数据存储格式。</bullet_item><para/>
        ///     <bullet_item>带有 XYZ 的 ASCII 文件 - XYZ 文件。</bullet_item><para/>
        ///     <bullet_item>带有 XYZI 的 ASCII 文件 - XYZI 文件。</bullet_item><para/>
        ///     <bullet_item>生成格式的 ASCII 文件 - GENERATE 文件。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        public PointFileInformation(List<object> _input, object _out_feature_class, _in_file_type_value _in_file_type)
        {
            this._input = _input;
            this._out_feature_class = _out_feature_class;
            this._in_file_type = _in_file_type;
        }
        public override string ToolboxName => "3D Analyst Tools";

        public override string ToolName => "Point File Information";

        public override string CallName => "3d.PointFileInformation";

        public override List<string> AcceptEnvironments => ["XYDomain", "XYResolution", "XYTolerance", "ZDomain", "ZResolution", "ZTolerance", "autoCommit", "configKeyword", "extent", "outputCoordinateSystem", "scratchWorkspace", "workspace"];

        public override object[] ParameterInfo => [_input, _out_feature_class, _in_file_type.GetGPValue(), _file_suffix, _input_coordinate_system, _folder_recursion.GetGPValue(), _extrude_geometry.GetGPValue(), _decimal_separator.GetGPValue(), _summarize_by_class_code.GetGPValue(), _improve_las_point_spacing.GetGPValue(), _min_point_spacing];

        /// <summary>
        /// <para>Point Data</para>
        /// <para><xdoc>
        ///   <para>Any combination of folders and files storing point records that will be analyzed.</para>
        ///   <para>In the tool dialog box, a folder can also be specified as an input by selecting the folder in Windows Explorer and dragging it onto the parameter's input box.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>存储将要分析的点记录的文件夹和文件的任意组合。</para>
        ///   <para>在工具对话框中，还可以通过在 Windows 资源管理器中选择文件夹并将其拖动到参数的输入框中，将文件夹指定为输入。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Point Data")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public List<object> _input { get; set; }


        /// <summary>
        /// <para>Output Feature Class</para>
        /// <para>The feature class that will be produced.</para>
        /// <para>将生成的要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_feature_class { get; set; }


        /// <summary>
        /// <para>File Format</para>
        /// <para><xdoc>
        ///   <para>Specifies the format of the input files.</para>
        ///   <bulletList>
        ///     <bullet_item>LAS format lidar—Lidar data storage format defined by the American Society of Photogrammetry and Remote Sensing (ASPRS).</bullet_item><para/>
        ///     <bullet_item>ASCII file with XYZ—XYZ file.</bullet_item><para/>
        ///     <bullet_item>ASCII file with XYZI—XYZI file.</bullet_item><para/>
        ///     <bullet_item>ASCII file in Generate format—GENERATE file.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定输入文件的格式。</para>
        ///   <bulletList>
        ///     <bullet_item>LAS 格式激光雷达 - 美国摄影测量与遥感学会 （ASPRS） 定义的激光雷达数据存储格式。</bullet_item><para/>
        ///     <bullet_item>带有 XYZ 的 ASCII 文件 - XYZ 文件。</bullet_item><para/>
        ///     <bullet_item>带有 XYZI 的 ASCII 文件 - XYZI 文件。</bullet_item><para/>
        ///     <bullet_item>生成格式的 ASCII 文件 - GENERATE 文件。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("File Format")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _in_file_type_value _in_file_type { get; set; }

        public enum _in_file_type_value
        {
            /// <summary>
            /// <para>LAS format lidar</para>
            /// <para>LAS format lidar—Lidar data storage format defined by the American Society of Photogrammetry and Remote Sensing (ASPRS).</para>
            /// <para>LAS 格式激光雷达 - 美国摄影测量与遥感学会 （ASPRS） 定义的激光雷达数据存储格式。</para>
            /// </summary>
            [Description("LAS format lidar")]
            [GPEnumValue("LAS")]
            _LAS,

            /// <summary>
            /// <para>ASCII file with XYZ</para>
            /// <para>ASCII file with XYZ—XYZ file.</para>
            /// <para>带有 XYZ 的 ASCII 文件 - XYZ 文件。</para>
            /// </summary>
            [Description("ASCII file with XYZ")]
            [GPEnumValue("XYZ")]
            _XYZ,

            /// <summary>
            /// <para>ASCII file with XYZI</para>
            /// <para>ASCII file with XYZI—XYZI file.</para>
            /// <para>带有 XYZI 的 ASCII 文件 - XYZI 文件。</para>
            /// </summary>
            [Description("ASCII file with XYZI")]
            [GPEnumValue("XYZI")]
            _XYZI,

            /// <summary>
            /// <para>ASCII file in Generate format</para>
            /// <para>ASCII file in Generate format—GENERATE file.</para>
            /// <para>生成格式的 ASCII 文件 - GENERATE 文件。</para>
            /// </summary>
            [Description("ASCII file in Generate format")]
            [GPEnumValue("GENERATE")]
            _GENERATE,

        }

        /// <summary>
        /// <para>File Suffix</para>
        /// <para>The suffix of the files to be imported when a folder is specified in the input. This parameter is required if an input folder is provided.</para>
        /// <para>在输入中指定文件夹时要导入的文件的后缀。如果提供了输入文件夹，则此参数是必需的。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("File Suffix")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _file_suffix { get; set; } = null;


        /// <summary>
        /// <para>Coordinate System</para>
        /// <para>The coordinate system of the input data.</para>
        /// <para>输入数据的坐标系。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Coordinate System")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _input_coordinate_system { get; set; } = null;


        /// <summary>
        /// <para>Include Subfolders</para>
        /// <para><xdoc>
        ///   <para>Specifies whether data in subfolders will be used to generate results. The tool scans subfolders when an input folder is selected containing data in a subfolders directory. The output feature class will be generated with a row for each file encountered in the directory structure.</para>
        ///   <bulletList>
        ///     <bullet_item>Unchecked—Only the data found in the input folder will be used to generate the results. This is the default.</bullet_item><para/>
        ///     <bullet_item>Checked—Any data found in the input folder and its subdirectories will be used to generate results.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定是否使用子文件夹中的数据生成结果。当选择包含子文件夹目录中数据的输入文件夹时，该工具将扫描子文件夹。输出要素类将为目录结构中遇到的每个文件生成一行。</para>
        ///   <bulletList>
        ///     <bullet_item>未选中 - 仅使用输入文件夹中的数据生成结果。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>选中 - 在输入文件夹及其子目录中找到的任何数据都将用于生成结果。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Include Subfolders")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _folder_recursion_value _folder_recursion { get; set; } = _folder_recursion_value._false;

        public enum _folder_recursion_value
        {
            /// <summary>
            /// <para>RECURSION</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("RECURSION")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NO_RECURSION</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NO_RECURSION")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Extrude Geometry Shapes</para>
        /// <para><xdoc>
        ///   <para>Specifies whether the output will be created as a 2D polygon or multipatch feature class with extruded features that reflect the elevation range found in each file.</para>
        ///   <bulletList>
        ///     <bullet_item>Unchecked—The output will be created as a 2D polygon feature class. This is the default.</bullet_item><para/>
        ///     <bullet_item>Checked—The output will be created as a multipatch feature class.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定是将输出创建为 2D 面要素类，还是将拉伸要素创建为反映每个文件中的高程范围的拉伸要素类。</para>
        ///   <bulletList>
        ///     <bullet_item>未选中 - 输出将创建为 2D 面要素类。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>选中 - 输出将创建为多面体要素类。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Extrude Geometry Shapes")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _extrude_geometry_value _extrude_geometry { get; set; } = _extrude_geometry_value._false;

        public enum _extrude_geometry_value
        {
            /// <summary>
            /// <para>EXTRUSION</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("EXTRUSION")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NO_EXTRUSION</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NO_EXTRUSION")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Decimal Separator</para>
        /// <para><xdoc>
        ///   <para>The decimal character that will be used in the text file to differentiate the integer of a number from its fractional part.</para>
        ///   <bulletList>
        ///     <bullet_item>Point—A point will be used as the decimal character. This is the default.</bullet_item><para/>
        ///     <bullet_item>Comma—A comma will be used as the decimal character.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>将在文本文件中用于区分数字的整数与其小数部分的十进制字符。</para>
        ///   <bulletList>
        ///     <bullet_item>点—点将用作十进制字符。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>逗号—逗号将用作十进制字符。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Decimal Separator")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _decimal_separator_value _decimal_separator { get; set; } = _decimal_separator_value._DECIMAL_POINT;

        public enum _decimal_separator_value
        {
            /// <summary>
            /// <para>Point</para>
            /// <para>Point—A point will be used as the decimal character. This is the default.</para>
            /// <para>点—点将用作十进制字符。这是默认设置。</para>
            /// </summary>
            [Description("Point")]
            [GPEnumValue("DECIMAL_POINT")]
            _DECIMAL_POINT,

            /// <summary>
            /// <para>Comma</para>
            /// <para>Comma—A comma will be used as the decimal character.</para>
            /// <para>逗号—逗号将用作十进制字符。</para>
            /// </summary>
            [Description("Comma")]
            [GPEnumValue("DECIMAL_COMMA")]
            _DECIMAL_COMMA,

        }

        /// <summary>
        /// <para>Summarize by class code</para>
        /// <para><xdoc>
        ///   <para>Specifies whether the results will summarize LAS files per class code or per LAS file. This option will require an intensive scan of the LAS file.</para>
        ///   <bulletList>
        ///     <bullet_item>Unchecked—Each output feature will represent all the data found in a lidar file. This is the default.</bullet_item><para/>
        ///     <bullet_item>Checked—Each output feature will represent a single class code found in a lidar file.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定结果是按类代码汇总 LAS 文件还是按 LAS 文件汇总 LAS 文件。此选项需要对 LAS 文件进行密集扫描。</para>
        ///   <bulletList>
        ///     <bullet_item>未选中 - 每个输出要素将表示在激光雷达文件中找到的所有数据。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>选中 - 每个输出要素将表示在激光雷达文件中找到的单个类代码。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Summarize by class code")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _summarize_by_class_code_value _summarize_by_class_code { get; set; } = _summarize_by_class_code_value._false;

        public enum _summarize_by_class_code_value
        {
            /// <summary>
            /// <para>SUMMARIZE</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("SUMMARIZE")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NO_SUMMARIZE</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NO_SUMMARIZE")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Improve LAS files point spacing estimate</para>
        /// <para><xdoc>
        ///   <para>Specifies whether enhanced assessment of the point spacing in LAS files, which can reduce over-estimation caused by irregular data distribution, will be used.</para>
        ///   <bulletList>
        ///     <bullet_item>Unchecked—Regular point spacing estimate is used for LAS files, where the extent is equally divided by the number of points. This is the default.</bullet_item><para/>
        ///     <bullet_item>Checked—Binning will be used to obtain a more precise point spacing estimate for LAS files. This may increase the tool's execution time.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定是否使用对 LAS 文件中的点间距的增强评估，以减少因数据分布不规则而导致的高估。</para>
        ///   <bulletList>
        ///     <bullet_item>未选中 - 常规点间距估计用于 LAS 文件，其中范围除以点数。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>选中 - 将使用像素合并来获取 LAS 文件的更精确的点间距估计值。这可能会增加工具的执行时间。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Improve LAS files point spacing estimate")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _improve_las_point_spacing_value _improve_las_point_spacing { get; set; } = _improve_las_point_spacing_value._false;

        public enum _improve_las_point_spacing_value
        {
            /// <summary>
            /// <para>LAS_SPACING</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("LAS_SPACING")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NO_LAS_SPACING</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NO_LAS_SPACING")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Average Point Spacing</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Average Point Spacing")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public double? _min_point_spacing { get; set; }


        public PointFileInformation SetEnv(object XYDomain = null, object XYResolution = null, object XYTolerance = null, object ZDomain = null, object ZResolution = null, object ZTolerance = null, int? autoCommit = null, object configKeyword = null, object extent = null, object outputCoordinateSystem = null, object scratchWorkspace = null, object workspace = null)
        {
            base.SetEnv(XYDomain: XYDomain, XYResolution: XYResolution, XYTolerance: XYTolerance, ZDomain: ZDomain, ZResolution: ZResolution, ZTolerance: ZTolerance, autoCommit: autoCommit, configKeyword: configKeyword, extent: extent, outputCoordinateSystem: outputCoordinateSystem, scratchWorkspace: scratchWorkspace, workspace: workspace);
            return this;
        }

    }

}